package com.jse;

import java.util.regex.Pattern;

public class Strings {

    public static Pattern CHINESE = Pattern.compile("[\u4e00-\u9fa5]");

    /**
     * 将传入字符串的第一个字符转换为小写，并返回新的字符串。
     *
     * @param s 待处理的字符串。
     * @return 转换第一个字符为小写后的字符串。
     */
    public static String firstLowerCase(String s) {
        // 将字符串的第一个字符转为小写，再将剩余部分拼接回去
        return Character.toLowerCase(s.charAt(0)) + s.substring(1);
    }

    /**
     * 将传入字符串的第一个字符转换为大写，并返回新的字符串。
     *
     * @param s 待处理的字符串。
     * @return 转换第一个字符为大写后的字符串。
     */
    public static String firstUpperCase(String s) {
        // 将字符串的第一个字符转为大写，再将剩余部分拼接回去
        return Character.toUpperCase(s.charAt(0)) + s.substring(1);
    }

        /**
     * 若给定的CharSequence对象为空或其内容为空白字符串，则返回空字符串（""），否则返回原对象。
     *
     * @param v 需要检查并可能被替换的CharSequence对象。
     * @return 当v为空或其内容为空白时返回空字符串，否则返回v本身。
     */
    public static CharSequence def(CharSequence v) {
        return isEmpty(v) ? "" : v;
    }

    /**
     * 若给定的CharSequence对象为空或其内容为空白字符串，则返回指定备用字符串（s.toString()），否则返回原对象。
     *
     * @param v 需要检查并可能被替换的CharSequence对象。
     * @param s 当v为空或其内容为空白时返回的备用字符串。
     * @return 当v为空或其内容为空白时返回备用字符串s，否则返回v本身。
     */
    public static String def(CharSequence v, CharSequence s) {
        return isEmpty(v) ? s.toString() : v.toString();
    }

    /**
     * 检查给定的CharSequence对象是否为空或其内容是否为空白字符串。
     *
     * @param s 需要检查的CharSequence对象。
     * @return 若s为null或其内容为空白字符串，返回true；否则返回false。
     */
    public static boolean isBlank(CharSequence s) {
        return s == null || s.toString().isBlank();
    }

    /**
     * 检查给定的CharSequence对象是否为空或其长度为0。
     *
     * @param s 需要检查的CharSequence对象。
     * @return 若s为null或其长度为0，返回true；否则返回false。
     */
    public static boolean isEmpty(CharSequence s) {
        return s == null || s.isEmpty();
    }

    /**
     * 检查给定的CharSequence对象是否非空且其长度大于0。
     *
     * @param s 需要检查的CharSequence对象。
     * @return 若s非null且其长度大于0，返回true；否则返回false。
     */
    public static boolean isNotEmpty(CharSequence s) {
        return !isEmpty(s);
    }

    /**
     * 检查给定的CharSequence对象是否非空且其内容不为空白字符串。
     *
     * @param s 需要检查的CharSequence对象。
     * @return 若s非null且其内容不为空白字符串，返回true；否则返回false。
     */
    public static boolean isNotBlank(CharSequence s) {
        return !isBlank(s);
    }

    /**
     * 判断给定的CharSequence对象是否包含至少一个中文字符。
     *
     * @param str 需要检查的CharSequence对象。
     * @return 若str中包含至少一个中文字符，返回true；否则返回false。
     */
    public static boolean hasChinese(CharSequence str) {
        return CHINESE.matcher(str).find();
    }

    /**
     * 判断给定的CharSequence对象是否包含至少一个大写字母。
     *
     * @param s 需要检查的CharSequence对象。
     * @return 若s中包含至少一个大写字母，返回true；否则返回false。
     */
    public static boolean hasUpperCase(CharSequence s) {
        return s.chars().anyMatch(c -> Character.isUpperCase(c));
    }

    /**
     * 判断给定的字符串是否仅由数字组成且非空。
     *
     * @param s 需要判断的字符串。
     * @return 若s非空且仅由数字组成，返回true；否则返回false。
     */
    public static boolean isNumber(String s) {
        return isNotEmpty(s) && s.chars().allMatch(Character::isDigit);
    }
    /**
     * 判断一个字符串是否为回文字符串.
     * 设置两个指针，一个指向字符串的开始，另一个指向字符串的结束。每次比较两个指针所指向的字符是否相等，如果相等则同时向中心移动指针；否则返回false。当两个指针相遇或者交错时，说明字符串是回文。
     * @param str
     * @return
     */
    public static boolean isPalindromeUsing(String str) {
        int left = 0;
        int right = str.length() - 1;
        while (left < right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}